// app.js - 基于 Express 的完整示例（带CORS支持）

// 1. 引入所需模块
const express = require('express');
const axios = require('axios'); // 添加 axios
const app = express();
const port = 3010;

// 2. 中间件配置
// 启用CORS（跨域资源共享）
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
  res.setHeader('Access-Control-Allow-Credentials', true);

  // 处理 OPTIONS 预检请求
  if (req.method === 'OPTIONS') {
    res.sendStatus(200);
    return;
  }
  next();
});

// 解析 JSON 请求体
app.use(express.json());
// 解析 URL 编码的请求体
app.use(express.urlencoded({ extended: true }));

// 3. 自定义中间件（示例：记录请求日志）
app.use((req, res, next) => {
  console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
  next();
});

// 4. 路由定义
// 主页路由
app.get('/', (req, res) => {
  res.send('欢迎来到 Express 服务器！');
});

// API 路由示例
app.get('/api/users', (req, res) => {
  res.json([
    { id: 1, name: '张三' },
    { id: 2, name: '李四' }
  ]);
});

// 用户登录接口
app.post('/api/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    
    const response = await axios.post('http://localhost:40013/VocalBuddy/API/login_resgitser.php', {
      action: 'login',
      app_security_code: 'VOCALBUDDY2024',
      username,
      password
    });

    res.json(response.data);
  } catch (error) {
    console.error('登录失败:', error);
    res.status(500).json({
      success: false,
      message: '登录过程中发生错误',
      error: error.response?.data || error.message
    });
  }
});

// 用户注册接口
app.post('/api/register', async (req, res) => {
  try {
    const { username, email, password, learning_language } = req.body;
    
    const response = await axios.post('http://localhost:40013/VocalBuddy/API/login_resgitser.php', {
      action: 'register',
      app_security_code: 'VOCALBUDDY2024',
      username,
      email,
      password,
      learning_language
    });

    res.json(response.data);
  } catch (error) {
    console.error('注册失败:', error);
    res.status(500).json({
      success: false,
      message: '注册过程中发生错误',
      error: error.response?.data || error.message
    });
  }
});

// 获取用户信息接口
app.get('/api/user/info', async (req, res) => {
  try {
    const { user_id } = req.query;
    
    const response = await axios.get(`http://localhost:40013/VocalBuddy/API/login_resgitser.php?user_id=${user_id}&app_security_code=VOCALBUDDY2024`);

    res.json(response.data);
  } catch (error) {
    console.error('获取用户信息失败:', error);
    res.status(500).json({
      success: false,
      message: '获取用户信息过程中发生错误',
      error: error.response?.data || error.message
    });
  }
});

// POST 路由示例
app.post('/api/users', (req, res) => {
  console.log('收到创建用户请求:', req.body);
  // 这里应该是数据库插入操作
  res.status(201).json({ message: '用户创建成功', data: req.body });
});

// 测试接口 - 返回用户名
app.post('/api/test/echo', (req, res) => {
  const { username } = req.body;
  res.json({ username });
});

// 获取单词数据接口
app.get('/api/getWords', async (req, res) => {
  try {
    const { word_rank } = req.query;
    
    const response = await axios.get('http://39.98.54.173:40013/VocalBuddy/API/word_insert.php', {
      params: {
        word_rank
      }
    });

    res.json(response.data);
  } catch (error) {
    console.error('获取单词数据失败:', error);
    res.status(500).json({
      success: false,
      message: '获取单词数据过程中发生错误',
      error: error.response?.data || error.message
    });
  }
});

// 图像生成接口
app.post('/api/cover_image_generation', async (req, res) => {
  try {
    const { prompt } = req.body;
    prompt_whole = '你是一个故事封面设计大师，你需要帮我设计短文故事的封面图片。请根据下面的内容，设计一个吸引人的封面图片。要注意画面干净、清爽，画面上部最好简洁、留白。主题是:' + prompt 


    const response = await axios.post('https://open.bigmodel.cn/api/paas/v4/images/generations', {
      model: "cogview-3-flash",
      prompt,
      quality: "standard",
      size: "1344x768"
    }, {
      headers: {
        'Authorization': `Bearer ${process.env.ZHIPUAI_API_KEY || '6eb6de30d0c6bab295e8730d7a8a71a0.gbET8XqExYOb99Ni'}`,
        'Content-Type': 'application/json'
      },
      timeout: 30000,
      retry: 5,
      retryDelay: 2000
    });

    res.json({
      success: true,
      image_url: response.data.data[0].url
    });
  } catch (error) {
    console.error('图像生成失败:', error);
    res.status(500).json({
      success: false,
      message: '图像生成过程中发生错误',
      error: error.response?.data || error.message
    });
  }
});


// 故事生成接口
app.post('/api/story_generation', async (req, res) => {
  try {
    const { prompt,theme} = req.body;
    
    const systemPrompt = `你是一个英语学习智能助手，你需要根据用户提供的单词或主题，生成一个尽量复合${theme}主题的英文故事。
请确保故事生动有趣，并在故事中合理使用目标单词。生成的故事长度应该适中，建议在300字左右。在故事原文中，把用户给出的单词用括号括起来。

请按照以下JSON格式返回：
{
    "story_title": "故事标题",
    "story_content": "英文故事原文",
    "chinese_translation": "中文翻译",
}`;

    const response = await axios.post('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
      model: "glm-4-flash-250414",
      messages: [
        {"role": "system", "content": systemPrompt},
        {"role": "user", "content": prompt}
      ],
    }, {
      headers: {
        'Authorization': `Bearer ${process.env.ZHIPUAI_API_KEY || '6eb6de30d0c6bab295e8730d7a8a71a0.gbET8XqExYOb99Ni'}`,
        'Content-Type': 'application/json'
      },
      timeout: 10000,
      retry: 2,
      retryDelay: 2000
    });

    if (!response.data || !response.data.choices || !response.data.choices[0] || !response.data.choices[0].message) {
      throw new Error('AI接口返回数据格式不正确');
    }

    let result;
    try {
      // 尝试解析JSON响应
      const content = response.data.choices[0].message.content;
      result = JSON.parse(content);
    } catch (parseError) {
      console.error('解析JSON响应失败:', parseError);
      // 尝试清理和提取JSON
      const content = response.data.choices[0].message.content;
      const cleanedContent = content.replace(/[\u0000-\u001F\u007F-\u009F]/g, '');
      const jsonMatch = cleanedContent.match(/\{[\s\S]*\}/);
      if (jsonMatch) {
        result = JSON.parse(jsonMatch[0]);
      } else {
        throw new Error('无法提取有效的JSON数据');
      }
    }

    // 验证返回的数据结构
    if (!result.story_title || !result.story_content || !result.chinese_translation) {
      throw new Error('故事生成结果格式不完整');
    }

    res.json({
      success: true,
      data: result
    });
  } catch (error) {
    console.error('故事生成失败:', error);
    res.status(500).json({
      success: false,
      message: '故事生成过程中发生错误',
      error: error.message
    });
  }
});

// 聊天对话接口
app.post('/api/chat', async (req, res) => {
  try {
    const { messages, type } = req.body;
    
    // 构建系统提示，让AI扮演特定类型的英语老师
    const systemPrompt = `你是一个${type || '友善'}风格的英语老师Kris，是一款英语学习软件VocalBuddy:词友星球的专任AI老师，你需要和学生进行互动，帮助他们学习英语。你在自我介绍时，请扮演好你的角色，不要和学生聊与学习无关的内容。
请用生动有趣的方式教授英语知识，纠正学生的错误，并鼓励他们进步。`;
    
    // 构建完整的消息数组，添加系统角色消息
    const fullMessages = [
      {"role": "system", "content": systemPrompt}
    ];
    
    // 添加用户提供的消息历史
    if (Array.isArray(messages) && messages.length > 0) {
      fullMessages.push(...messages);
    }
    
    const response = await axios.post('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
      model: "glm-4-plus",
      messages: fullMessages
    }, {
      headers: {
        'Authorization': `Bearer ${process.env.ZHIPUAI_API_KEY || '6eb6de30d0c6bab295e8730d7a8a71a0.gbET8XqExYOb99Ni'}`,
        'Content-Type': 'application/json'
      }
    });

    res.json({
      success: true,
      reply: response.data.choices[0].message
    });
  } catch (error) {
    console.error('聊天对话失败:', error);
    res.status(500).json({
      success: false,
      message: '聊天对话过程中发生错误',
      error: error.response?.data || error.message
    });
  }
});

// 5. 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('服务器出错啦！');
});

// 6. 404 处理
app.use((req, res) => {
  res.status(404).send('页面未找到');
});

// 7. 启动服务器
app.listen(port, '0.0.0.0', () => {
  console.log(`服务器已启动，访问 http://localhost:${port}`);
  console.log(`外部访问地址: http://${getIPAddress()}:${port}`);
});

// 8. 获取本机IP地址（用于外部访问）
function getIPAddress() {
  const interfaces = require('os').networkInterfaces();
  for (const devName in interfaces) {
    const iface = interfaces[devName];
    for (let i = 0; i < iface.length; i++) {
      const alias = iface[i];
      if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
        return alias.address;
      }
    }
  }
  return 'localhost';
}


// 9. 导出 app（方便测试）
module.exports = app;